// 定义求最大值的宏
#define max(a, b) ((a) > (b) ? (a) : (b))

int findMaxForm(char** strs, int strsSize, int m, int n) {
    // step 1# 定义并初始化二维dp数组
    // dp[i][j]：最多有i个0、j个1时，最多能选多少个字符串
    int dp[m + 1][n + 1];
    memset(dp, 0, sizeof(int) * (m + 1) * (n + 1));

    // step 2# 遍历每一个字符串
    for (int i = 0; i < strsSize; i++) {
        // step 2.1# 统计当前字符串中的0和1的数量
        int count0 = 0;
        int count1 = 0;
        char *str = strs[i];
        while (*str != '\0') {
            if (*str == '0') {
                count0++;
            } else {
                count1++;
            }
            str++;
        }

        // step 2.2# 倒序遍历背包容量（从大到小）
        for (int j = m; j >= count0; j--) {
            for (int k = n; k >= count1; k--) {
                // step 2.3# 状态转移
                // 不选：dp[j][k]保留原值
                // 选：dp[j - count0][k - count1] + 1
                dp[j][k] = max(dp[j][k], dp[j - count0][k - count1] + 1);
            }
        }
    }

    // step 3# 返回最终最大能选的字符串数量
    return dp[m][n];
}
